/*
 * ModelObject.h
 *
 *  Created on: 03.10.2012
 *      Author: caffeine
 */

#ifndef MODELOBJECT_H_
#define MODELOBJECT_H_
#include "ContainerNodeObject.h"
#include "ILoadableObject.h"
#include <irrlicht.h>

namespace irr{
namespace object{

/***
* @class ModelObject
* Класс абстрактной модели. Для правельной работы должен быть указан контейнер через
* конструктор или метод setContainer. Реализует загрузку и выгрузку. Нужно подменить
* методы на загрузку и выгрузку моделей: on_model_load и on_model_unload. Делать проверки
* на повторную загрузку не требуется
* */
class ModelObject: public virtual irr::ILoadableObject {
private:
	ContainerNodeObject*container;
	bool loaded;
protected:
	virtual void on_load();
	virtual void on_unload();

	/***
	* Загрузка модели. Не нужно делать проверок на повторную щагрузку
	*
	* @param parent родительский объект, внтури которого должна быть создана модель
	* */
	virtual void on_model_load(irr::scene::ISceneNode*parent)=0;
	
	/***
	* Выгруза модели из памяти. Не нужно делать проверок на повторную выгрузку модели
	* */
	virtual void on_model_unload()=0;
public:
	/***
	* Конструктор.
	*
	* @param container контейнер модели. Может быть равным NULL, но при этом не будет работать загрузка модели
	* @param device устройство, в пределох которых должна работать модель
	* */
	ModelObject(ContainerNodeObject*container,irr::IrrlichtDevice*device);
	virtual ~ModelObject();
	
	/***
	* Устанавливает контейнер. Должна вызываться, только при выгруженной модели
	*
	* @param container, который нужно устанавить
	* */
	virtual bool setContainer(ContainerNodeObject*container);
	virtual ContainerNodeObject*getContainer();
};

}//namespace object
}//namespace irr

#endif /* MODELOBJECT_H_ */
